package com.dh.leetcode.eight;

import org.junit.Assert;
import org.junit.Test;

import java.util.HashMap;
import java.util.Map;

/**
 * @ClassName: _888_fair_candy_swap
 * @Description: 888. 公平的糖果棒交换
 * 爱丽丝和鲍勃有不同大小的糖果棒：A[i] 是爱丽丝拥有的第 i 根糖果棒的大小，B[j] 是鲍勃拥有的第 j 根糖果棒的大小。
 * <p>
 * 因为他们是朋友，所以他们想交换一根糖果棒，这样交换后，他们都有相同的糖果总量。（一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。）
 * <p>
 * 返回一个整数数组 ans，其中 ans[0] 是爱丽丝必须交换的糖果棒的大小，ans[1] 是 Bob 必须交换的糖果棒的大小。
 * <p>
 * 如果有多个答案，你可以返回其中任何一个。保证答案存在。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：A = [1,1], B = [2,2]
 * 输出：[1,2]
 * 示例 2：
 * <p>
 * 输入：A = [1,2], B = [2,3]
 * 输出：[1,2]
 * 示例 3：
 * <p>
 * 输入：A = [2], B = [1,3]
 * 输出：[2,3]
 * 示例 4：
 * <p>
 * 输入：A = [1,2,5], B = [2,4]
 * 输出：[5,4]
 * <p>
 * https://leetcode-cn.com/problems/fair-candy-swap/
 * @Author: shouzimu
 * @Date: 2021/2/1 15:57
 */
public class _888_fair_candy_swap {

    /**
     * 变相的求数字之和
     * @param A
     * @param B
     * @return
     */
    public int[] fairCandySwap(int[] A, int[] B) {
        int[] res = new int[2];
        int target;
        int sumA = 0;
        int sumB = 0;
        Map<Integer, Integer> mapB = new HashMap<>();
        for (int i : A) {
            sumA += i;
        }
        for (int i : B) {
            sumB += i;
            mapB.put(i, i);
        }
        target = (sumA + sumB) / 2;
        for (int i : A) {
            int cha = target - sumA + i;
            Integer b = mapB.get(cha);
            if (null != b) {
                res[0] = i;
                res[1] = b;
                break;
            }
        }
        return res;
    }


    @Test
    public void fairCandySwapTest() {
        Assert.assertArrayEquals(new int[]{1, 2}, fairCandySwap(new int[]{1, 2}, new int[]{2, 3}));
        Assert.assertArrayEquals(new int[]{1, 2}, fairCandySwap(new int[]{1, 1}, new int[]{2, 2}));
        Assert.assertArrayEquals(new int[]{2, 3}, fairCandySwap(new int[]{2}, new int[]{1, 3}));
        Assert.assertArrayEquals(new int[]{5, 4}, fairCandySwap(new int[]{1, 2, 5}, new int[]{2, 4}));
    }
}
